(function($){
	//Configurações de Busca
	var pageOptions = {
			'recordsNumber': null,
			'pagesNumber': null,
			'blocksNumber': null,
			'recordsPerPage': null,
			'pagesPerBlock': null,
			'currentBlock': null
	};
	
	//Parâmetros de busca
	var search = {};
	
	$.paginar = function(selector, paginationOptions, searchOptions, urlLista){
		
		//Se enviar o JSON de opcoesBusca atribuo os valores recebidos com o objeto busca (global);
		if(searchOptions)$.extend(search, searchOptions);
		
		//Se enviar o JSON de options atribuo os valores recebidos com o objeto settings (global);
		if(paginationOptions)$.extend(pageOptions, paginationOptions);
		
		//Montando os atributos que serão enviados ao PHP
		var count = 0;
		
		var searchAttributes = null;
		searchAttributes = '';
		for(var j in search)
		{
		   if(count != 0){
			   searchAttributes += '&'+j+'='+search[j];
		   }else{
			   searchAttributes += j+'='+search[j];
		   }
		   count++;
		}

		// Primeira chamada da lista enviando a primeira página.
		var searchData = searchAttributes+"&pag="+1+"&recordsPerPage="+pageOptions.recordsPerPage;
//		alert("DATA "+searchData);
		$.ajax({
			type: "POST",
			data: searchData,
			url: urlLista,
			beforeSend: function(){
				$("#lista").html("<img src='./images/loading.gif' />");
			},
			success: function(result){
				$("#lista").html(result);
			}
		});
		
		var pagination = createPagination(pageOptions);
		
		var obj = $(selector);
		obj.html(pagination);
		
		//Chamada da função para atribuir o css
		addCSS();
		
		//Gerenciando o click da classe voltar
		obj.find('.back').die('click').live('click',function(e){
			pageOptions.currentBlock = pageOptions.currentBlock - 1;
			var pagination = createPagination(pageOptions);
			obj.html(pagination);
			addCSS();
		});
		
		//Gerenciando o click da classe avançar
		obj.find('.forward').die('click').live('click',function(e){
			pageOptions.currentBlock = pageOptions.currentBlock + 1;
			var pagination = createPagination(pageOptions);
			obj.html(pagination);
			addCSS();
		});

		//Gerenciando o click das páginas
		obj.find('.pagination').die('click').live('click',function(e){
			var searchData = searchAttributes+"&pag="+$(this).attr("id")+"&recordsPerPage="+pageOptions.recordsPerPage;
			$.ajax({
				type: "POST",
				data: searchData,
				url: urlLista,
				beforeSend: function(){
					$("#lista").html("<img src='./images/loading.gif' />");
				},
				success: function(result){
					$("#lista").html(result);
				}
			});
			
			addCSS();
			addCSScurrentPage($(this));
		});
		
		//Gerenciando o evento mouseover da página
		obj.find('.pagination, .back, .forward').live('mouseover',function(e){
			$(this).css("cursor","pointer");
		});
	};

	/**
	 * Função responsável por criar a paginação recebendo os valores de configuração
	 */
	function createPagination(pageOptions){
		var pagination = "<div> Quantidade de P&aacute;ginas: "+pageOptions.pagesNumber+"</div>";
		var i;
		if(pageOptions.currentBlock != 1){
			pagination += "<div class='back'>...</div>";
		}		                                
                
		var start = pageOptions.pagesPerBlock * pageOptions.currentBlock - pageOptions.pagesPerBlock + 1;
		var end;
		if(pageOptions.pagesNumber < pageOptions.pagesPerBlock){
			end = pageOptions.pagesNumber;
		}else{
			end = pageOptions.pagesPerBlock * pageOptions.currentBlock;
		}
		
		if(end > pageOptions.pagesNumber )
			end = pageOptions.pagesNumber;
		
		for(i = start; i <= end; i++)
		{
			pagination += "<div class='pagination' id='"+i+"'>"+i+"</div>";
		}
		
		if(pageOptions.currentBlock < pageOptions.blocksNumber){
			pagination += "<div class='forward'>...</div>";
		}
		return pagination;
	}
	
	/**
	 * Função responsável por atribuir as propriedades de css na div paginação
	 */
	function addCSS(){
		var CSSproperty = {
				'display': 'inline',
				'padding': '2px', 
				'margin': '3px',
				'font-size': '1em',
				'background-color': 'darkgray',
				'color': 'black'
		};
		$(".pagination, .back, .forward").css(CSSproperty);
	}
	
	/**
	 * Função responsável por marcar(CSS) a página atual
	 */
	
	function addCSScurrentPage(obj){
		var CSSproperty = {
				'color': 'white',
				'background-color': 'black',
				'display': 'inline'
		};
		obj.css(CSSproperty);
	}
})(jQuery);